﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using Website.Logger;
using DAL;
using UtilityExtensions;
using BOL.RendicionVentas;
using BOL;
using WebLib;
using BOL.Cliente;
using System.Web.Script.Services;
using System.Web.Services;

namespace UILGestion.VentaAdmin.RendicionVenta
{
    public partial class RendicionVentaEditForm : System.Web.UI.Page
    {

        public RendicionVentaEditForm()
        {
            bol = new RendicionVentaBL();
        }

        private RendicionVentaBL bol;




        [WebMethod(), ScriptMethod()]
        public static string GetCliente(String prefixText, String contextKey)
        {

            //ClienteSearchInfo nuevo = new ClienteSearchInfo();
            //nuevo.descripcion = "<strong><span  style='color: #FFFF00;background-color: #800000;'>Registrar nuevo Cliente</span></strong>";
            //nuevo.idInternal = 0;
               
            //todos los clientes d
            var var = contextKey.Split('|');
            int idConcepto=var[0].ToInt();
            int idproyecto = var[1].ToInt();
            //idOrdenVentaFormato--> contextKey
            //var ordeVentaFormato = DbUtil.Db.OrdenVentaFormatos.SingleOrDefault(p => p.idInternal == contextKey.ToInt());

            var par = (from a in DbUtil.Db.OrdenVentaFormatos
                     where (a.OrdenVentaItem.OrdenVenta.Cliente.descripcion).Contains(prefixText)
                      & a.OrdenVentaItem.OrdenVenta.idProyecto == idproyecto
                       & a.OrdenVentaItem.OrdenVenta.idEstado!=10
                       & a.idConcepto == idConcepto
                     select new ClienteSearchInfo
                     {
                         idInternal = a.OrdenVentaItem.OrdenVenta.Cliente.idInternal,
                         descripcion = a.OrdenVentaItem.OrdenVenta.Cliente.descripcion,
                         numDocumento = a.OrdenVentaItem.OrdenVenta.Cliente.numDocumento,
                         correo = a.OrdenVentaItem.OrdenVenta.Cliente.email,
                         direccion = a.OrdenVentaItem.OrdenVenta.Cliente.Direccion.descripcion,
                         telefono = a.OrdenVentaItem.OrdenVenta.Cliente.telefono,
                         tipoDocumento = a.OrdenVentaItem.OrdenVenta.Cliente.TipoDocumento.abreviacion,
                         vista = String.Format("{0}:{1} {2}", a.OrdenVentaItem.OrdenVenta.Cliente.TipoDocumento.abreviacion, a.OrdenVentaItem.OrdenVenta.Cliente.numDocumento, a.OrdenVentaItem.OrdenVenta.Cliente.descripcion),
                     }).Distinct().Take(35);





            return Util.Tbl2Str(Util.EntidadToDataTable(par.ToList()));

        }
      
        public void SetEstadistica()
        {
            DataSet ds= (DataSet)Session[idColeccion.Value];


            var q= ds.Tables[bol.RENDICIONVENTAITEMINFO].AsEnumerable().Where(p=>p.RowState!=DataRowState.Deleted);
            var w = ds.Tables[bol.LIQUIDACIONVENTAINFO].AsEnumerable().Where(p => p.RowState != DataRowState.Deleted);

            decimal totaldocumento = (q.Count() > 0) ? q.Sum(p => p.Field<decimal>("total")) : 0;
            decimal totalDeposito = (w.Count() > 0) ? w.Sum(p => p.Field<decimal>("total")) : 0;

            decimal diferencia = totaldocumento - totalDeposito;

            totalDepositoLBL.Text=totalDeposito.ToString("N3");
            totalDiferenciaLBL.Text=diferencia.ToString("N3");
            totalDocumentoLBL.Text=totaldocumento.ToString("N3");
            cabUPNL.Update();


        }

        protected void Page_Load(object sender, EventArgs e)
        {
            //evitamos los no posback
            clienteTXT.ChkVal = (string)Request.QueryString["idConcepto"] + "|" + (string)Request.QueryString["idProyecto"];

            if (!Page.IsPostBack)
            {
                try
                {
                     type.Value = (string)Request.QueryString["type"];
                     internalID.Value = (string)Request.QueryString["id"];
                     idProyecto.Value =(string)Request.QueryString["idProyecto"];
                   
                     paginaAnt.Value = Page.Request.UrlReferrer.AbsoluteUri;
                     type.Value = (type.Value == String.Empty) ? "A" : type.Value;
                     menuCtrl1.loadMenuVenta(idProyecto.Value.ToInt());
                     FormatForm();

                }
                catch (SqlException sqlex)
                {
                    WebServerSideSqlError.Log(sqlex);

                    ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                     "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


                }
                catch (Exception ex)
                {
                    WebServerSideError.Log(ex);
                    ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                         "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

                }

            }
        }
       
        private void Insert()
        {
            DataSet ds= (DataSet)Session[idColeccion.Value];
            internalID.Value = bol.Add(
                fechaTXT.Text.ToDate().Value, 
                conceptoDDL.SelectedValue.ToInt(), 
                monedaDDL.SelectedValue.ToInt(),
                idProyecto.Value.ToInt(), 
                comentarioTXT.Text,
                ds).ToString();
        }

        private void Update()
        {
            //bol.Update(internalID.Value.ToInt(),
            //                descripcionTXT.Text,
            //                comentarioTXT.Text,
            //                areTXT.Text.ToDecimal().Value
            //                );

            
        }

        protected void button(object sender, EventArgs e)
        {
            
            try
            {

                if ((sender as Button).ID ==saveBTN.ID)
                {

                    if (type.Value == "E")   { Update(); }
                    if (type.Value == "A")    {Insert(); }

                    Response.Redirect("~/VentaAdmin/RendicionVenta/RendicionVentaReadForm.aspx?id={0}&idProyecto={1}".Fmt(internalID.Value,idProyecto.Value), true);
                   

                }
                if ((sender as Button).ID == cancelarBTN.ID)
                {
                    Response.Redirect(paginaAnt.Value, true);
                }
                if ((sender as Button).ID ==refreshBTN.ID)
                {
                    FormatForm();
                }
                if ((sender as Button).ID == AddDocumentoVenta.ID)
                {
                    PendientePagoPanel2.ClearSeleccion();
                    PendientePagoPanel2.DataBind();
                    AddDocumentoVentaModal.Show();   
                }
                if (((Button)sender).ID == AddPendienteVentaButton.ID)
                {

                    var lista = PendientePagoPanel2.SeleccionList;
                    foreach (var item in lista)
                    {
                        rendicionVentaItemGrid1.LoadFromOrdenVentaFormato(idColeccion.Value.ToInt(),idConcepto.Value.ToInt(),
                            internalID.Value.ToInt(),DbUtil.Db.OrdenVentaFormatos.Single(p => p.idInternal == item));

                    };
                    AddDocumentoVentaModal.Hide();
                }


            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);

                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                     "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }




        }
        private void ShowAllComboBox()
        {
           var lista= new ListValueBL();

            monedaDDL.DataValueField="idInternal";
            monedaDDL.DataTextField="descripcion";
            monedaDDL.DataSource = lista.GetMoneda();
            monedaDDL.DataBind();

            conceptoDDL.DataValueField = "idInternal";
            conceptoDDL.DataTextField = "descripcion";
            conceptoDDL.DataSource = lista.GetConceptoVenta();
            conceptoDDL.DataBind();


           
        }

        private void Load()
        {
            DAL.RendicionVenta rendicionVenta = DbUtil.Db.RendicionVentas.Single(p => p.idInternal == internalID.Value.ToInt());
            fechaTXT.Text = rendicionVenta.fecha.ToShortDateString();
            tipoCambioLBL.Text = rendicionVenta.tipoCambio.ToString("N3");
            //LoadCliente(rendicionVenta.Cliente);
            usuarioLBL.Text = rendicionVenta.Empleado.descripcion;

            
            
            
           
        }

        private void FormatForm()
        {

            //--------------------
            //int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
            //bool acceso = new DAL.FormularioAcceso().VerificarAcceso(DbUtil.Db,
            //    idEmpleadoEmisor,
            //    11, //Proveeedor
            //    2); //lectura
            ////------------------------- 
            //// los paneles presentes en el formulario
            //pnlMain.Visible = true;
            ShowAllComboBox();
                
            //areTXT.Text="0.00";
            idColeccion.Value = Parametros.GenerarID().ToString();
            monedaselDDL.Text = monedaDDL.SelectedItem.Text;

            if (type.Value == "E")
            {
                Load();
                LoadItem(internalID.Value.ToInt()); //de DB  ESQUEMA
                LoadItemLiquidacion(internalID.Value.ToInt()); //DB ESQUEMA
                
            }
            if (type.Value == "A")
            {
                fechaTXT.Text = DateTime.Now.ToShortDateString();
                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                usuarioLBL.Text = DbUtil.Db.Empleados.Single(p => p.idInternal == idEmpleadoEmisor).descripcion;
                string idOrdenVentaConcepto = (string)Request.QueryString["idOrdenVentaFormato"];
                string idColeccionLista = (string)Request.QueryString["idColeccion"];
                string idConcepto = (string)Request.QueryString["idConcepto"];
                //--------datos de la busqueda

                
               
                //debe tener tipo de cambio 

                loadTipoCambio(DateTime.Now);
                LoadItem(internalID.Value.ToInt()); //de DB  ESQUEMA
                LoadItemLiquidacion(internalID.Value.ToInt()); //DB ESQUEMA
                conceptoDDL.SelectedValue = idConcepto;
                conceptoSelDDL.SelectedValue = idConcepto;
                if (idConcepto.ToInt() != 3)
                {
                    LiquidacionVentaGrid1.HideRetencion();
                    LiquidacionVentaGrid1.HideTotal();
                }

                if (idOrdenVentaConcepto.ToInt() != 0)
                {
                    DAL.OrdenVentaFormato ordenVentaConcepto = DbUtil.Db.OrdenVentaFormatos.Single(p => p.idInternal == idOrdenVentaConcepto.ToInt());
                    idOrdenVenta.Value = ordenVentaConcepto.OrdenVentaItem.idOrdenVenta.ToString();
                   
                    //LoadCliente(ordenVentaConcepto.OrdenVentaItem.OrdenVenta.Cliente);
                    rendicionVentaItemGrid1.LoadFromOrdenVentaFormato(idColeccion.Value.ToInt(), idConcepto.ToInt(), internalID.Value.ToInt(), ordenVentaConcepto);
                }
                if (idColeccionLista.ToInt() != 0)
                {
                    var lista = (List<int>)Session[idColeccionLista];
                    DAL.OrdenVentaFormato ordenVentaConcepto = DbUtil.Db.OrdenVentaFormatos.Single(p => p.idInternal == lista.First().ToInt());

                    foreach (var item in lista)
                    {
                        var ordenVetaFormato=DbUtil.Db.OrdenVentaFormatos.Single(p => p.idInternal == item);
                        rendicionVentaItemGrid1.LoadFromOrdenVentaFormato(idColeccion.Value.ToInt(),idConcepto.ToInt(),
                            internalID.Value.ToInt(),ordenVetaFormato );
                    
                    };

                    idOrdenVenta.Value = ordenVentaConcepto.OrdenVentaItem.idOrdenVenta.ToString();
                     LoadCliente(ordenVentaConcepto.OrdenVentaItem.OrdenVenta.Cliente);
                    

                    rendicionVentaItemGrid1.LoadFromOrdenVentaFormato(idColeccion.Value.ToInt(),idConcepto.ToInt(),
                        internalID.Value.ToInt(), ordenVentaConcepto);
                }

                
                LiquidacionVentaGrid1.Load(idColeccion.Value.ToInt(),internalID.Value.ToInt(),idProyecto.Value.ToInt(),monedaDDL.SelectedValue.ToInt());
                

            }
            SetEstadistica();
        
        }

        private void LoadCliente(Cliente cliente)
        {
            //cliente1TXT.Text = cliente.descripcion;
            //idClienteTXT.Text = cliente.idInternal.ToString();
            //docClienteTXT.Text = cliente.TipoDocumento.abreviacion;
            //numDocClienteTXT.Text = cliente.numDocumento;
        }

        private  void loadTipoCambio(DateTime Fecha)
        {
            tipoCambioLBL.Text = "0.00";
            tipoCambioLBL.Text = DbUtil.Db.Monedas.Single(p => p.idInternal == 4).getTipoCambio(DbUtil.Db,DateTime.Now).ToString("N3");
            tipoCambioUPNL.Update();

        }

        private void LoadItem(int idParent)
        {

            DataTable ordenVentaItemList = Util.EntidadToDataTable(bol.GetRendicionVentaItem(idParent));

            DataSet ds = new DataSet();

            ordenVentaItemList.TableName = bol.RENDICIONVENTAITEMINFO;

            ds.Tables.Add(ordenVentaItemList);
            ds.AcceptChanges();

            Session[idColeccion.Value] = ds;
        }
        private void LoadItemLiquidacion(int idParent)
        {

            DataTable ordenVentaItemList = Util.EntidadToDataTable(bol.GetLiquidacionVenta(idParent));

            DataSet ds=(DataSet)Session[idColeccion.Value];

            ordenVentaItemList.TableName = bol.LIQUIDACIONVENTAINFO;

            ds.Tables.Add(ordenVentaItemList);
            ds.AcceptChanges();

            Session[idColeccion.Value] = ds;
        }
     
        protected void fechaTXT_TextChanged(object sender, EventArgs e)
        {
            try
            {

                loadTipoCambio(fechaTXT.Text.ToDate().Value);
            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);

                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                     "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }
        }

        protected void monedaDDL_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (((DropDownList)sender).ID == monedaDDL.ID)
                {
                    PendientePagoPanel2.DataBind();
                }
                if (((DropDownList)sender).ID == monedaDDL.ID)
                {
                    PendientePagoPanel2.DataBind();
                }
                
                


            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);

                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);
            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                     "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }

           
        }

    }
}